import ToolRequest from '@/base/newToolAxios';
import RequestOption from '@/base/RequestOption';
import { getActToolUrl } from '@/base/constant';
import dayjs, { Dayjs } from 'dayjs';

const tr = new ToolRequest();

export default class projectDao {
  /**
   * 创建项目
   *
   * @param {Object} formState - 包含项目创建所需信息的对象
   * @param {string} formState.projectName - 项目名称
   * @param {string} formState.projectDescription - 项目描述
   * @param {string} formState.projectType - 项目类型
   * @param {Dayjs}   dayjs()  - 创建时间
   * @param {string} formState.creatorId - 创建者ID
   * @param {number[]} formState.leaders - 项目负责人列表
   * @param {dayjs} formState.endTime - 项目结束时间 "YYYY-MM-DD HH:mm:ss"
   * @returns {number} - 200表示创建成功，0表示创建失败
   * @note 在实际代码中，需要将 dayjs对象 转换为 "yyyy-MM-dd HH:mm:ss" 格式的字符串后再发送请求，否则后端无法识别。
   */
  async createProject(formState) {
    const ro = new RequestOption();
    return await tr.post(
      getActToolUrl(),
      {
        action: 'createProject',
        projectName: formState.projectName,
        projectDescription: formState.projectDescription,
        createTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
        projectType: formState?.projectType,
        creatorId: formState?.creatorId,
        leaders: JSON.stringify(formState.leaders),
        endTime: formState.endTime?.format('YYYY-MM-DD HH:mm:ss')
      },
      ro
    );
  }

  /**
   * 根据用户ID、项目名称（可选）、项目日期（可选）以及分页参数来检索项目列表。
   *
   * @param  userId - 用户ID
   * @param  projectName - 项目名称
   * @param  projectType - 项目类型
   * @param  projectStatus - 项目状态
   * @param  projectDate - 时间范围
   * @param  currentPage - 当前页数
   * @param  pageSize   -每页条数
   * @return 带分页器的项目列表
   */
  async findProjects(
    userId: number,
    projectName: string,
    projectType: number,
    projectStatus: number,
    projectDate,
    currentPage: number,
    pageSize: number
  ) {
    const ro = new RequestOption();
    console.log(getActToolUrl());
    return await tr.get(
      getActToolUrl(),
      {
        action: 'findProjects',
        userId: userId,
        projectName: projectName,
        projectType: projectType,
        projectStatus: projectStatus,
        projectDate: projectDate?.join(','),
        currentPage: currentPage,
        pageSize: pageSize
      },
      ro
    );
  }
  /**
   * 根据项目ID来检索项目基本信息和人员信息，如果为项目式教学项目，则还会查询关联的课程。
   *
   * @param projectId - 项目ID
   * @param projectType - 项目类型，用于区分项目式教学项目于普通项目
   * @return 返回项目基本信息 - 200表示查询成功，0表示查询失败
   */
  async findProjectByProjectId(projectId: number, projectType: number) {
    const ro = new RequestOption();
    return await tr.get(
      getActToolUrl(),
      {
        action: 'findProjectByProjectId',
        projectId: projectId,
        projectType: projectType
      },
      ro
    );
  }

  /**
  * 根据项目ID、用户名称（可选）来检索相关项目成员。
  
  * @param  projectId - 项目ID 
  * @param  userName - 用户名
  * @param  projectType -项目类型 
  * @returns  用户列表
  */
  async findProjectMemberByProjectId(projectId: number, userName: string, projectType: number) {
    const ro = new RequestOption();
    return await tr.get(
      getActToolUrl(),
      {
        action: 'findProjectMemberByProjectId',
        projectId: projectId,
        userName: userName,
        projectType: projectType
      },
      ro
    );
  }
  /**
  * 根据项目ID、课程ID 来检索相关项目成员。
  
  * @param  projectId - 项目ID 
  * @param  courseId - 课程id 
  * @returns  小组列表
  */
  async findProjectTeamsAndMembersByProjectId(projectId: number, courseId: number) {
    const ro = new RequestOption();
    return await tr.get(
      getActToolUrl(),
      {
        action: 'findProjectTeamsAndMembersByProjectId',
        projectId: projectId,
        courseId: courseId
      },
      ro
    );
  }

  /**
  * 更新项目的成员
  * 根据传输的成员列表，增删改相对应项目下的成员
  
  * @param {number} projectId - 项目ID 
  * @param {string} userList - 用户列表
  * 
  */
  async upsertDeleteUsers(projectId: number, userList) {
    const ro = new RequestOption();
    return await tr.post(
      getActToolUrl(),
      {
        action: 'upsertDeleteUsers',
        projectId: projectId,
        userList: JSON.stringify(userList)
      },
      ro
    );
  }

  /**
   * 更新项目信息
   * 根据传输的项目信息，修改数据库中对应的项目实体
   *
   * @param {string} projectName - 项目名称
   * @param {string} projectDescription - 项目描述
   * @param {number} projectStatusprojectStatus - 项目状态
   * @param {dayjs}  startTime- 开始时间
   * @param {dayjs} endTime - 结束时间
   *
   */
  async updateProject(formState) {
    const ro = new RequestOption();
    return await tr.post(
      getActToolUrl(),
      {
        action: 'updateProject',
        projectId: formState.projectId,
        projectName: formState.projectName,
        projectDescription: formState.projectDescription,
        projectStatus: formState.projectStatus,
        startTime: formState.startTime?.format('YYYY-MM-DD HH:mm:ss'),
        endTime: formState.endTime?.format('YYYY-MM-DD HH:mm:ss')
      },
      ro
    );
  }

  /**
  * 更新项目关联的课程
  * 根据传输的课程列表，增删改相对应项目关联的课程
  
  * @param {number} projectId - 项目ID 
  * @param {string} courseList - 课程列表
  * 
  */
  async upsertDeleteCourses(projectId: number, courseList) {
    const ro = new RequestOption();
    return await tr.post(
      getActToolUrl(),
      {
        action: 'upsertDeleteCourses',
        projectId: projectId,
        courseList: JSON.stringify(courseList)
      },
      ro
    );
  }
}
